package com.version1.diabeco.ui.peso;


import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

import kankan.wheel.widget.OnWheelChangedListener;
import kankan.wheel.widget.WheelView;
import kankan.wheel.widget.adapters.ArrayWheelAdapter;
import kankan.wheel.widget.adapters.NumericWheelAdapter;
import kankan.wheel.widget.adapters.WheelViewAdapter;

import com.version1.diabeco.ActivityMain;
import com.version1.diabeco.DateArrayAdapter;
import com.version1.diabeco.DateNumericAdapter;
import com.version1.diabeco.R;
import com.version1.diabeco.data.ajustes.perfilusuario.PerfilUsuarioDaoImpl;
import com.version1.diabeco.data.peso.PesoDaoImpl;
import com.version1.diabeco.model.ajustes.perfilusuario.PerfilUsuario;
import com.version1.diabeco.model.peso.Peso;
import com.version1.diabeco.ui.ajustes.perfilusuario.ActivityPerfilUsuario;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


public class ActivityRegistroPeso extends Activity {
	private Button btnFecha, btnHora;
	private Calendar objCalendario;
	private Intent intentPesoNueva;
	private WheelView wheelPeso, wheelSeparador, wheelPesoDecimal, wheelUm;
	private PerfilUsuario objPerfilUsuario;
	private String[] arrayUm = {"Vacio"};
	public static final float PIES_X_METRO = 0.30480F;
	public static final float PULGADAS_X_METRO = 39.370079F;
	public static final float PULGADAS_X_PIES = 12F;
	public static final float IMC_MINIMO = 18F;
	public static final float IMC_NORMAL_BAJO = 18.1F;
	public static final float IMC_NORMAL_ALTO = 24.9F;
	public static final float IMC_SOBREPESO_BAJO = 25F;
	public static final float IMC_SOBREPESO_ALTO = 29.9F;
	public static final float IMC_OBESIDAD = 30F;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_registro_peso);

		//Cargamos el Perfil de Usuario de la Base de Datos
		objPerfilUsuario = PerfilUsuarioDaoImpl.getInstance(this).selectUsuarioActivo();
		if (objPerfilUsuario.getAltura() < 0.5 ||
			objPerfilUsuario.getAltura() == null) {
			mostrarMensajeCargaAltura();
		}
		
		// Elementos de la Pantalla
		btnFecha 	  = (Button) findViewById(R.id.btnFecha);
		btnHora 	  = (Button) findViewById(R.id.btnHora);
		objCalendario = Calendar.getInstance();
		wheelPeso 	     = (WheelView) findViewById(R.id.wheelPeso);
		wheelSeparador 	 = (WheelView) findViewById(R.id.wheelSeparador);
		wheelPesoDecimal = (WheelView) findViewById(R.id.wheelPesoDecimal);
        wheelUm 		 = (WheelView) findViewById(R.id.wheelUm);
        
        //Obtenemos el Intent
       	intentPesoNueva = getIntent();
       	Peso peso = (Peso) intentPesoNueva
       				.getSerializableExtra(ActivityListaRegistrosPeso.INTENT_VALUE_PESO);
        
       	//Cargamos el whell
       	inicicializarWhell(peso);
        
     	// Cargamos la fecha y la Hora
		cargarBtnFecha(peso.getFecha());
		cargarBtnHora(peso.getFecha());
	}

	
	@Override
	protected void onResume() {
		super.onResume();
		objPerfilUsuario = PerfilUsuarioDaoImpl.getInstance(this).selectUsuarioActivo();
	}
	
	
	private void inicicializarWhell(Peso peso) {
		int pesoEntero, pesoDecimal;
		 
		if (peso.getPeso()!=null) {
		 	float result = peso.getPeso();
		 	pesoEntero = (int) result;
	       	pesoDecimal = (int) ((result - pesoEntero) * 10);
	       	arrayUm[0] = peso.getUm();
		}else {
			arrayUm[0] = objPerfilUsuario.getUmPeso(); 
			if (!objPerfilUsuario.getPeso().toString().isEmpty()) {
			 	float result = objPerfilUsuario.getPeso();
			 	pesoEntero = (int) result;
		       	pesoDecimal = (int) ((result - pesoEntero) * 10);
			} else { if (objPerfilUsuario.getSexo().equals(ActivityMain.SEXO_HOMBRE)) {
						pesoEntero = 70;
						pesoDecimal = 0;
					 } else {
						pesoEntero = 50;
						pesoDecimal = 0;
					 }
			}
		}
	
       	
		// Peso 
	    NumericWheelAdapter pesoAdapter = new NumericWheelAdapter(this, 0, 199);
	    pesoAdapter.setItemResource(R.layout.wheel_text_time);
	    pesoAdapter.setItemTextResource(R.id.text);
	    wheelPeso.setViewAdapter(pesoAdapter);	
	    wheelPeso.setCyclic(true);
	    wheelPeso.setCurrentItem(pesoEntero);

		//Punto Separador
        ArrayWheelAdapter<String> sepAdapter = new ArrayWheelAdapter<String>(this, new String[] {"."});
        sepAdapter.setItemResource(R.layout.wheel_text_time);
        sepAdapter.setItemTextResource(R.id.text);
        wheelSeparador.setViewAdapter(sepAdapter);
        
		//Peso Parte Decimal
        ArrayWheelAdapter<String> pesoDecAdapter = new ArrayWheelAdapter<String>(this, new String[] {"0","1","2","3","4","5","6","7","8","9"});
        pesoDecAdapter.setItemResource(R.layout.wheel_text_time);
        pesoDecAdapter.setItemTextResource(R.id.text);
        wheelPesoDecimal.setViewAdapter(pesoDecAdapter);
        wheelPesoDecimal.setCyclic(true);
        wheelPesoDecimal.setCurrentItem(pesoDecimal);
		
		//Unidad de Medida
        ArrayWheelAdapter<String> umAdapter = new ArrayWheelAdapter<String>(this, arrayUm);
        umAdapter.setItemResource(R.layout.wheel_text_time);
        umAdapter.setItemTextResource(R.id.text);
        wheelUm.setViewAdapter(umAdapter);
	}


//	@Override
//	public boolean onCreateOptionsMenu(Menu menu) {
//		// Inflate the menu; this adds items to the action bar if it is present.
//		getMenuInflater().inflate(R.menu.activity_peso_nueva, menu);
//		return true;
//	}

	
	/** Carga la Fecha actual y grisa el campo si recibe la fecha por parametro **/
	void cargarBtnFecha(Long fecha) {
		int intDia, intMes, intAno;

		if (fecha == null) {
			// Agregamos la fecha actual y llamamos al DatePicketDialog
			intDia = objCalendario.get(Calendar.DAY_OF_MONTH);
			intMes = objCalendario.get(Calendar.MONTH) + 1;
			intAno = objCalendario.get(Calendar.YEAR);

			btnFecha.setText(new StringBuilder().append(intDia).append("/").
												 append(intMes).append("/").
												 append(intAno).append(" "));
		} else {
			btnFecha.setText(ActivityMain.DATE_FORMAT.format(new Date(fecha)));
			btnFecha.setEnabled(false);
		}
	}

	
	/** Carga la Hora actual y grisa el campo **/
	void cargarBtnHora(Long hora) {
		int intHora, intMinuto;

		if (hora == null) {
			// Agregamos la fecha actual y llamamos al DatePicketDialog
			objCalendario = Calendar.getInstance();
			intHora = objCalendario.get(Calendar.HOUR_OF_DAY);
			intMinuto = objCalendario.get(Calendar.MINUTE);

			CharSequence strHora = "", strMinuto = "";			
			if (intHora < 10) {
				strHora = new StringBuilder().append(0).append(intHora);
			} else {
				strHora = new StringBuilder().append(intHora);
			}

			if (intMinuto < 10) {
				strMinuto = new StringBuilder().append(0).append(intMinuto);
			} else {
				strMinuto = new StringBuilder().append(intMinuto);
			}
			
			btnHora.setText(new StringBuilder().append(strHora).append(":").append(strMinuto));				
		} else {
			btnHora.setText(ActivityMain.TIME_FORMAT.format(new Date(hora)));
			btnHora.setEnabled(false);
		}
	}
	
	
	/** Se llama al hacer click en "Guardar" */
	public void pesoBotonGuardar(View view) {
	
		if (validarPantalla() == false) {
			guardarPeso();
		}
		
	}

	
	private boolean validarPantalla() {
		Resources res = getResources();
		
		//Peso
		float floatPeso = (float) wheelPeso.getCurrentItem();
		float floatPesoDec = (float) wheelPesoDecimal.getCurrentItem();
		floatPesoDec = floatPesoDec / 10;
		floatPeso = floatPeso + floatPesoDec;  
		
		if (objPerfilUsuario.getUmPeso().equals(ActivityMain.UM_KGS)) {
			if (!(floatPeso>=ActivityPerfilUsuario.PESO_MIN_KGS && floatPeso<=ActivityPerfilUsuario.PESO_MAX_KGS)) {
				Toast.makeText(this, res.getString(R.string.msg_rango_peso_kgs), Toast.LENGTH_SHORT).show();
				return true;
			}
		} else {
			if (!(floatPeso>=ActivityPerfilUsuario.PESO_MIN_LBS && floatPeso<=ActivityPerfilUsuario.PESO_MAX_LBS)) {
				Toast.makeText(this, res.getString(R.string.msg_rango_peso_lbs), Toast.LENGTH_SHORT).show();
				return true;
			}
		}
		return false;
	}

	private void guardarPeso() {
		Peso peso = (Peso) intentPesoNueva
				.getSerializableExtra(ActivityListaRegistrosPeso.INTENT_VALUE_PESO);
		
		//Alias
		peso.setAlias(objPerfilUsuario.getId());
		
		//Peso
		float floatPeso = (float) wheelPeso.getCurrentItem();
		float floatPesoDec = (float) wheelPesoDecimal.getCurrentItem();
		floatPesoDec = floatPesoDec / 10;
		floatPeso = floatPeso + floatPesoDec;  
		peso.setPeso(floatPeso);
		
		//Um Peso
		peso.setUm(arrayUm[wheelUm.getCurrentItem()]);  
		
		//IMC
		Float altura = objPerfilUsuario.getAltura();
		Float imc = 0F;

		if (altura > 0.5) {
			if (peso.getUm().equals(ActivityMain.UM_KGS)) {
				if (objPerfilUsuario.getUmAltura().equals(ActivityMain.UM_MTS)) { //Pasamos la altura a Pulgadas
					altura = altura * 1; 
				} else {
					altura = altura * PIES_X_METRO;
				}
				imc = floatPeso / (altura * altura);
			} else { //Si son Lbs
				if (objPerfilUsuario.getUmAltura().equals(ActivityMain.UM_MTS)) { //Pasamos la altura a Pulgadas
					altura = altura * PULGADAS_X_METRO; 
				} else {
					altura = altura * PULGADAS_X_PIES;
				}
				imc = floatPeso / (altura*altura);
			}
			
			//Lo pasamos a 2 decimales antes de setearlo
			imc = (float)Math.round(imc * 100) / 100;
			peso.setImc(imc);
		}
		
		//IMC TIPO
		if (imc > 0) {
			String imc_tipo = "";
			if (imc<=IMC_MINIMO) {
				imc_tipo = "Menor al Normal";
			}
			if (imc>=IMC_NORMAL_BAJO && imc<=IMC_NORMAL_ALTO ) {
				imc_tipo = "Normal";
			}
			if (imc>=IMC_SOBREPESO_BAJO && imc<=IMC_SOBREPESO_ALTO ) {
				imc_tipo = "Sobrepeso";
			}
			if (imc>=IMC_OBESIDAD) {
				imc_tipo = "Obesidad";
			}
			peso.setImcTipo(imc_tipo);
		}

		
		//Pasamos la fecha y la hora
		String strDia = (String) btnFecha.getText();
		String strHora = (String) btnHora.getText();

		Date dia;
		Date hora;
		try {
			dia = ActivityMain.DATE_FORMAT.parse(strDia);
			hora = ActivityMain.TIME_FORMAT.parse(strHora);
		} catch (ParseException e) {
			throw new RuntimeException(e);
		}
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(hora);
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		int minutes = calendar.get(Calendar.MINUTE);

		calendar.setTime(dia);
		calendar.set(Calendar.HOUR, hour);
		calendar.set(Calendar.MINUTE, minutes);
		
		peso.setFecha(calendar.getTimeInMillis());


		//Grabamos
		PesoDaoImpl.getInstance(this).save(peso);

		// Salimos
		Toast.makeText(this, "Peso Guardado", Toast.LENGTH_SHORT).show();
		this.finish();
		
	}

	/** Se llama al hacer click en "Cancelar" */
	public void pesoBotonCancelar(View view) {
		Toast.makeText(this, "Operacion Cancelada", Toast.LENGTH_SHORT).show();
		this.finish();
	}
	
	
	/** Se llama al hacer click en el Boton "Hora" */
	public void ClickHora(View v) {
		LayoutInflater inf = LayoutInflater.from(this);

		// Layout que contiene los wheel's
		View view = inf.inflate(R.layout.wheeltime, null);

		// Hora wheel
		final WheelView hours = (WheelView) view.findViewById(R.id.hours);
		hours.setViewAdapter(new NumericWheelAdapter(this, 0, 23));
		hours.setCyclic(true);
		hours.setCurrentItem(objCalendario.get(Calendar.HOUR_OF_DAY));

		// Minutos wheel
		final WheelView mins = (WheelView) view.findViewById(R.id.minutes);
		mins.setViewAdapter(new NumericWheelAdapter(this, 0, 59));
		mins.setCyclic(true);
		mins.setCurrentItem(objCalendario.get(Calendar.MINUTE));

		// Dialogo
		new AlertDialog.Builder(this).setMessage(R.string.titulo_dialogo_hora).setView(view)
				.setPositiveButton(R.string.btn_fijar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						CharSequence strHora = "", strMinuto = "";
						
						int hora = hours.getCurrentItem();
						if (hora < 10) {
							strHora = new StringBuilder().append(0).append(hora);
						} else {
							strHora = new StringBuilder().append(hora);
						}
						
						int minuto = mins.getCurrentItem();
						if (minuto < 10) {
							strMinuto = new StringBuilder().append(0).append(minuto);
						} else {
							strMinuto = new StringBuilder().append(minuto);
						}
						btnHora.setText(new StringBuilder().append(strHora).append(":").append(strMinuto));
					}
				})
				.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						return;
					}
				}).create().show();
	}

	
	/** Se llama al hacer click en el Boton "Fecha" */
	public void ClickFecha(View v) {
		LayoutInflater inf = LayoutInflater.from(this);
		Resources res = getResources();
        
		// layout of alert box contains
		View view = inf.inflate(R.layout.wheeldate, null);

		final WheelView month = (WheelView) view.findViewById(R.id.month);
		final WheelView year = (WheelView) view.findViewById(R.id.year);
		final WheelView day = (WheelView) view.findViewById(R.id.day);

		OnWheelChangedListener listener = new OnWheelChangedListener() {
			public void onChanged(WheelView wheel, int oldValue, int newValue) {
				updateDays(year, month, day);
			}
		};

		// month
		int curMonth = objCalendario.get(Calendar.MONTH);
		String months[] = res.getStringArray(R.array.lb_meses);
		month.setViewAdapter(new DateArrayAdapter(this, months, curMonth));
		// month.setCyclic(true);
		month.setCurrentItem(curMonth);
		month.addChangingListener(listener);

		// year
		final int curYear = objCalendario.get(Calendar.YEAR);
		WheelViewAdapter adapter;
		adapter = new DateNumericAdapter(this, curYear - 3, curYear + 10, 3);
		year.setViewAdapter(adapter);
		// year.setCyclic(true);
		year.setCurrentItem(3);
		year.addChangingListener(listener);

		// //day
		updateDays(year, month, day);
		// day.setCyclic(true);
		day.setCurrentItem(objCalendario.get(Calendar.DAY_OF_MONTH) - 1);

		new AlertDialog.Builder(this).setMessage(R.string.titulo_dialogo_fecha).setView(view)
				.setPositiveButton(R.string.btn_fijar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						// write code of lines, whatever want to with
						// value of this timepicker
						int dia = day.getCurrentItem() + 1;
						int mes = month.getCurrentItem() + 1;
						int ano = (curYear - 3) + year.getCurrentItem();

						btnFecha.setText(new StringBuilder().append(dia).append("/").append(mes).append("/")
								.append(ano).append(" "));
					}
				})

				.setNegativeButton(R.string.btn_cancelar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						return;
					}
				}).create().show();

	}


	/**
	 * Updates day wheel. Sets max days according to selected month and year
	 */
	void updateDays(WheelView year, WheelView month, WheelView day) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + year.getCurrentItem());
		calendar.set(Calendar.MONTH, month.getCurrentItem());

		int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		day.setViewAdapter(new DateNumericAdapter(this, 1, maxDays, calendar.get(Calendar.DAY_OF_MONTH) - 1));
		int curDay = Math.min(maxDays, day.getCurrentItem() + 1);
		day.setCurrentItem(curDay - 1, true);
	}


	/** PopUp para Mostrar una lista de valores **/
	public void mostrarMensajeCargaAltura() {

		AlertDialog popup;
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		 
	    builder.setTitle(R.string.titulo_ingreso_peso);
	    builder.setMessage(R.string.mensaje_ingreso_peso);
	    builder.setIcon(android.R.drawable.ic_dialog_alert);
	    builder.setCancelable(false);
	    
    	//Boton Aceptar
    	builder.setPositiveButton(R.string.btn_aceptar, new DialogInterface.OnClickListener() {

    		public void onClick(DialogInterface dialog, int position) {
    			// Creamos el Intent
    			Intent intent = new Intent(ActivityRegistroPeso.this, ActivityPerfilUsuario.class);
    			// Iniciamos la nueva actividad
    			startActivity(intent);    			
    	    	}
        	});
    	
	    
    	//Boton Cancelar    
	    builder.setNegativeButton(R.string.btn_cancelar, new DialogInterface.OnClickListener() {
	    public void onClick(DialogInterface dialog, int which) {
		    dialog.cancel();
	    	}
	    });
 
    //Cremos el PopUp y lo mostramos
	popup = builder.create();
	popup.show();		
	}	
}
